% function jaccard_sim_matrix=getJaccardKernel(y)
% krnl = y*y';
% y = krnl / mean(diag(krnl));
% jaccard_dist = pdist(y, 'jaccard');
% 
% % 计算 Jaccard 相似度核矩阵
% jaccard_sim_matrix = 1 - squareform(jaccard_dist);
% 
% 
% nan_rows = any(isnan(jaccard_sim_matrix), 2);
% 
% % 将包含 NaN 的行替换为 0
% jaccard_sim_matrix(nan_rows, :) = 0;
% end

function K = getJaccardKernel(X)
    % X 是 m x n 的数据矩阵，每行代表一个样本向量
    % K 将是 m x m 的核矩阵

    m = size(X,1);
    K = zeros(m, m);
    
    % 遍历每一对样本向量
    for i = 1:m
        for j = i:m  % 只计算上三角部分，下三角部分通过转置获得
            A = X(i, :);
            B = X(j, :);
            
            % 计算共同非零元素的数量
            intersection = sum(A ~= 0 & B ~= 0 & A == B);
            
            % 计算非零元素的总数
            union = sum(A ~= 0) + sum(B ~= 0) - intersection;
            
            % 计算杰卡德相似性
            if union > 0  % 防止除以零
                K(i, j) = intersection / union;
            end
        end
    end
    
    % 核矩阵是对称的，复制上三角部分到下三角部分
    K = K + K';
    K(eye(size(K)) == 1) = 1;  % 对角线上的元素设置为1
end